// 封装 axios
import axios, { AxiosInstance, InternalAxiosRequestConfig, AxiosResponse } from "axios"
import { message } from "antd"
import store from '../store/index'
// 引入路由跳转封装对象
import { navigatorRef } from '../utils/navigatorRef'

// 创建请求实例

const instance: AxiosInstance = axios.create({
  baseURL: 'http://www.demo.com',
  withCredentials: true,
  timeout: 5000
})

// 设置请求拦截器

instance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
  // 获取 token 将 token 设置到请求头中
  // 因为不是在组件中, 所以不能使用 redux 的 hooks
  const { token } = store.getState().userSlice
  if (token) {
    config['headers']['Authorization'] = token
  }
  return config
}, (err) => {
  // 请求失败的处理
  message.error('请求失败, 请重试!')
})


// 添加响应拦截器
instance.interceptors.response.use((response: AxiosResponse) => {
  // 判断是否请求成功
  const res = response.data
  if (res.code === 401) {
    navigatorRef.navigate && navigatorRef.navigate('/login', { replace: true })
    return Promise.reject(res)
  }
  if (res.code !== 200) {
    message.error(res.message || '响应错误')
    return Promise.reject(res)
  }
  return res.data
}, (err) => {
  // 请求失败的处理, 比如返回的 status 不是 200
  message.error('请求失败, 请重试!')
})

export default instance